Stream—sort排序(二)

 

List<Student> list = new ArrayList<>();

Student s1 = new Student("zhangsan","beijing",30,90.0);
list.add(s1);

Student s2 = new Student("lisi","shanghai",29,80.8);
list.add(s2);

Student s3 = new Student("lining","shandong",31,70.8);
list.add(s3);

Student s4 = new Student("fanbingbing","beijing",34,70.0);
list.add(s4);

Student s5 = new Student("libingbing","shanghai",30,95.0);
list.add(s5);

Student s6 = new Student("wangwu","shanghai",30,85.0);
list.add(s6);

// forEach循环
list.stream().forEach(student -> System.out.println(student));

结果:

Student{name='zhangsan', address='beijing', age=30, score=90.0}
Student{name='lisi', address='shanghai', age=29, score=80.8}
Student{name='lining', address='shandong', age=31, score=70.8}
Student{name='fanbingbing', address='beijing', age=34, score=70.0}
Student{name='libingbing', address='shanghai', age=30, score=95.0}
Student{name='wangwu', address='shanghai', age=30, score=85.0}

使用stream.sort排序

System.out.println("----------使用stream和sort根据年龄排序--默认升序----------");
// sort排序:原集合不变,新集合按顺序排序
List<Student> sortList1 = list.stream()
    .sorted((a, b) -> a.getAge().compareTo(b.getAge()))
    .collect(Collectors.toList());
sortList1.stream().forEach(s-> System.out.println(s));
System.out.println();

结果:

----------使用stream和sort根据年龄排序--默认升序----------
Student{name='lisi', address='shanghai', age=29, score=80.8}
Student{name='zhangsan', address='beijing', age=30, score=90.0}
Student{name='libingbing', address='shanghai', age=30, score=95.0}
Student{name='wangwu', address='shanghai', age=30, score=85.0}
Student{name='lining', address='shandong', age=31, score=70.8}
Student{name='fanbingbing', address='beijing', age=34, score=70.0}

使用stream的sorted排序,根据年龄倒序排序

System.out.println("---------使用stream和sort根据年龄排序--降序排列-----------");
List<Student> sortDesList = list.stream()
    .sorted(Comparator.comparingInt(Student::getAge).reversed())
    .collect(Collectors.toList());
sortDesList.stream().forEach(s-> System.out.println(s));
System.out.println();

结果:

---------使用stream和sort根据年龄排序--降序排列-----------
Student{name='fanbingbing', address='beijing', age=34, score=70.0}
Student{name='lining', address='shandong', age=31, score=70.8}
Student{name='zhangsan', address='beijing', age=30, score=90.0}
Student{name='libingbing', address='shanghai', age=30, score=95.0}
Student{name='wangwu', address='shanghai', age=30, score=85.0}
Student{name='lisi', address='shanghai', age=29, score=80.8}

使用stream的sorted根据多字段排序,根据年龄降序然后根据分数升序排序。

System.out.println("---------使用steam和sort根据多字段排序");
// 首先根据年龄降序排列,在根据成绩升序排序
Stream<Student> sortMoreList = list.stream().sorted(
    Comparator.comparingInt(Student::getAge).reversed()
    .thenComparing(Student::getScore));
sortMoreList.forEach(s-> System.out.println(s));
System.out.println();

结果:

---------使用steam和sort根据多字段排序
Student{name='fanbingbing', address='beijing', age=34, score=70.0}
Student{name='lining', address='shandong', age=31, score=70.8}
Student{name='wangwu', address='shanghai', age=30, score=85.0}
Student{name='zhangsan', address='beijing', age=30, score=90.0}
Student{name='libingbing', address='shanghai', age=30, score=95.0}
Student{name='lisi', address='shanghai', age=29, score=80.8}

分组排序

System.out.println("--------使用stream和sort分组排序");
// 根据地点进行分组,组内按照分数降序排序;注意,如果此时有多个字段排序是有问题的,也就是说分组后的排序是不准确的。只有一个排序时是没问题的。
Map<String, List<Student>> sortAndGroupMap = list.stream().sorted(
                    Comparator.comparingDouble(Student::getScore).reversed()
                ).collect(Collectors.groupingBy(Student::getAddress));

sortAndGroupMap.get("shandong").stream().forEach(s-> System.out.println(s));
System.out.println("------------");
sortAndGroupMap.get("beijing").stream().forEach(s-> System.out.println(s));
System.out.println("------------");
sortAndGroupMap.get("shanghai").stream().forEach(s-> System.out.println(s));

结果:

--------使用stream和sort分组排序
Student{name='lining', address='shandong', age=31, score=70.8}
------------
Student{name='zhangsan', address='beijing', age=30, score=90.0}
Student{name='fanbingbing', address='beijing', age=34, score=70.0}
------------
Student{name='libingbing', address='shanghai', age=30, score=95.0}
Student{name='wangwu', address='shanghai', age=30, score=85.0}
Student{name='lisi', address='shanghai', age=29, score=80.8}

使用集合自身sort排序

System.out.println("----------不使用stream和sort------------");
// 使用集合的sort排序,集合自身排序发生变化
list.sort((a,b)->a.getAge().compareTo(b.getAge()));
list.stream().forEach(student -> System.out.println(student));
System.out.println();

结果:

---------不适用stream和sort------------
Student{name='lisi', address='shanghai', age=29, score=80.8}
Student{name='zhangsan', address='beijing', age=30, score=90.0}
Student{name='libingbing', address='shanghai', age=30, score=95.0}
Student{name='wangwu', address='shanghai', age=30, score=85.0}
Student{name='lining', address='shandong', age=31, score=70.8}
Student{name='fanbingbing', address='beijing', age=34, score=70.0}

利用stream替换集合中对象的某一属性值

// list集合某一属性全部替换固定值
list.stream().forEach(student -> student.setAddress("china"));
System.out.println();

 

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值